import pygame
from game_items import *

class HudPanel(object):
    """指示器面板类"""

    margin = 10                         # 精灵之间的间距
    white = (255,255,255)               # 白色
    gray = (64,64,64)                   # 灰色


    reward_score = 100000               # 奖励分值
    level2_score = 10000                # 级别2分值
    level3_score = 50000                # 级别3分值

    record_filename = "record.txt"      # 最好成绩文件名

    def __init__(self,display_group):
        """初始化方法"""

        self.score = 0          # 游戏得分
        self.lives_count = 3    # 生命计数
        self.level = 1          # 游戏级别
        self.best_score = 0     # 最好成绩

        # 通过self指代对象本身来调用自身函数实现最好成绩加载
        self.load_best_score()
        # 创建图像精灵
        # 状态精灵
        self.status_sprite = StatuButton(("pause.png","resume.png"),display_group)
        self.status_sprite.rect.topleft =(self.margin,self.margin)

        # 炸弹精灵
        self.bomb_sprite = GameSprite("bomb.png", 0, display_group)
        self.bomb_sprite.rect.x = self.margin
        self.bomb_sprite.rect.bottom = SCREEN_RECT.bottom - self.margin

        # 生命计数精灵
        self.lives_sprite = GameSprite("life.png",0, display_group)
        self.lives_sprite.rect.right = SCREEN_RECT.right - self.margin
        self.lives_sprite.rect.bottom = SCREEN_RECT.bottom - self.margin

        # 创建标签精灵
        # 分数标签
        self.score_label = Label("%d" % self.score,32, self.gray, display_group)
        self.score_label.rect.midleft = (self.status_sprite.rect.right + self.margin,
                                        self.status_sprite.rect.centery)
        # 炸弹标签
        self.bomb_label = Label("X 3", 32, self.gray, display_group)
        self.bomb_label.rect.midleft = (self.bomb_sprite.rect.right + self.margin,
                                        self.bomb_sprite.rect.centery)

        # 生命计数标签
        self.lives_label = Label("X %d" % self.lives_count, 32, self.gray, display_group)
        self.lives_label.rect.midright = (SCREEN_RECT.right - self.margin,
                                      self.bomb_label.rect.centery)
        
        # 调整生命计数精灵位置
        self.lives_sprite.rect.right = self.lives_label.rect.left - self.margin

        # 最好成绩标签
        self.best_label = Label("Best: %d" % self.best_score,36, self.white) 


        self.status_label = Label("Game Over!",48,self.white)
       
        self.tip_label = Label("Press spacebar to play again.",22,self.white)
        


    def show_bomb(self,count):
        """显示炸弹数量
        : param count: 要显示的炸弹数量
        """
        # 设置炸弹标签文字
        self.bomb_label.set_text("X %d" % count)

        # 设置炸弹标签位置
        self.bomb_label.rect.midleft = (self.bomb_sprite.rect.right + self.margin,
                                        self.bomb_sprite.rect.centery)


    def show_lives(self):
        """显示生命计数"""
        # 设置生命计数标签文字
        self.lives_label.set_text("X %d" % self.lives_count)
        
        # 设置生命计数标签位置
        self.lives_label.rect.midright =(SCREEN_RECT.right - self.margin,
                                        self.bomb_label.rect.centery)

        # 调整生命计数精灵位置
        self.lives_sprite.rect.right = self.lives_label.rect.left - self.margin


    def increase_score(self, enemy_score):
        """增加游戏得分
        : param enemy_score: 摧毁敌机的分值
        : return: 增加 enemy_score 后，游戏级别是否提升
        """
        # 游戏得分
        score = self.score + enemy_score

        # 判断是否奖励生命
        if score // self.reward_score != self.score // self.reward_score:
            self.lives_count += 1
            self.show_lives()
        self.score = score
        # 最好成绩
        self.best_score = score if score > self.best_score else self.best_score
        # 游戏级别
        if score < self.level2_score:
            level = 1
        elif score < self.level3_score:
            level = 2
        else:
            level = 3
        is_upgrad = level != self.level
        self.level = level
        # 修改得分标签内容和位置
        self.score_label.set_text("%d" % self.score)
        self.score_label.rect.midleft = (self.status_sprite.rect.right + self.margin,
                                        self.status_sprite.rect.centery)
        return is_upgrad


    def save_best_score(self):
        """将最好成绩写入 record.txt"""
        # 打开文件夹
        file = open(self.record_filename,"w")
        # 写入分数
        file.write("%d" % self.best_score)
        # 关闭文件
        file.close()

    def load_best_score(self):
        """-从 record.txt 加载最好成绩"""
        try: # 通过异常处理避免因为文件不存在好产生错误
            file = open(self.record_filename)           # 打开文件流
            txt = file.readline()                       # 读取文件内容
            file.close()                                # 关闭文件
            self.best_score = int(txt)                  # 保存文件内容到实例属性best_score中
        except (FileNotFoundError,ValueError):
            print("文件不存在或者类型转换错误")


    def panel_pause(self, is_game_over,dispaly_group):
        """面板暂停
        : param is_game_over: 是否因为游戏结束需要暂停
        : param display_group: 显示精灵组
        """

        # 判断是否已经添加了精灵，如果是之酒返回
        if dispaly_group.has(self.status_label,self.tip_label,self.best_label):
            return
        # 根据是否结束游戏决定要显示的文字
        text = "Game Over!" if is_game_over else "Game Paused!"
        tip = "Press spaceber to"
        tip += "play again." if is_game_over else "continue."
        # 设置标签文字
        self.best_label.set_text("Best: %d" % self.best_score )
        self.status_label.set_text(text)
        self.tip_label.set_text(tip)
        # 设置标签位置，将之前位置代码复制到此处
        self.best_label.rect.center = SCREEN_RECT.center
        best_rect = self.best_label.rect
        self.status_label.rect.midbottom = (best_rect.centerx,
                                            best_rect.y - 2*self.margin)
        # 添加到精灵组
        dispaly_group.add(self.best_label,self.status_label,self.tip_label)
        # 切换状态精灵状态
        self.status_sprite.switch_status(True)

     
    def panel_resume(self,display_group):
        """面板恢复
        : param display_group: 显示精灵组
        """
        # 从精灵组移除3个标签精灵
        display_group.remove(self.status_label,self.tip_label,self.best_label)
        # 切换状态精灵
        self.status_sprite.switch_status(False)


    def reset_panel(self):
        """重置面板"""
        # 游戏属性
        self.score = 0                              #游戏得分
        self.lives_count = 3                        # 生命计数
        # 标签显示                        
        self.increase_score(0)                      # 增加0分
        self.show_bomb(3)                           # 炸弹数量
        self.show_lives()                           # 生命技术标签